package usuario.usuarioDAO;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import modelUtil.Configuracion;
import modelUtil.Util;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;

import usuario.usuarioTO.UsuarioTO;

public class XMLUsuarioDAO extends AbstractUsuarioDAO {

	public void crearUsuario(UsuarioTO uto) {
		try {
			Configuracion.instancia().leerDoc();
			File directorio = new File(Configuracion.instancia().getDirUsuarios() + uto.getNombre());
			directorio.mkdir();

			try {
				DocumentBuilderFactory factory = DocumentBuilderFactory
						.newInstance();
				Document doc = null;

				try {
					DocumentBuilder builder = factory.newDocumentBuilder();
					doc = builder.newDocument();

				} catch (Exception spe) {

				}
				// Add the root element
				Element root = doc.createElement("Usuario");
				doc.appendChild(root);
				// Añadimos las filas y columnas que tiene la plantilla
				Util.addTextElement(doc, root, "Nombre", uto.getNombre());
				Util.addTextElement(doc, root, "Imagen", uto.getImagen());
				Util.addTextElement(doc, root, "Barrido", uto.getBarrido());
				Util.addTextElement(doc, root, "Administrador", uto
						.getAdministrador());
				Util.addTextElement(doc, root, "Clave", uto.getClave());
				Util.addTextElement(doc, root, "TiempoBarrido", uto
						.getTiempoBarrido());
				Util.addTextElement(doc, root, "VelocidadPuntero", uto
						.getVelocidadPuntero());
				Util.addTextElement(doc, root, "VolumenVoz", uto
						.getVolumenVoz());
				Util.addTextElement(doc, root, "VelocidadVoz", uto
						.getVelocidadVoz());
				Util.addTextElement(doc, root, "NombreVoz", uto.getNombreVoz());
				Util.addTextElement(doc, root, "TecladoPrincipal", uto
						.getTecladoPrincipal());
				Util.addTextElement(doc, root, "Oculto", uto.getOculto());

				Util.guardarXML(doc, Configuracion.instancia().getDirUsuarios() + uto.getNombre() + "//" + uto.getNombre() + ".xml");

			} catch (Exception ex) {
				Util.popup(0, ResourceBundle.getBundle("internacionalizacion/Etiquetas").getString("etiqueta_error_guardar_usuario_XML"));
				return;
			}

		} catch (Exception ex) {
			Util.popup(0,ResourceBundle.getBundle("internacionalizacion/Etiquetas").getString("etiqueta_error_guardar_usuario"));
		}
	}

	public void eliminarUsuario(List<UsuarioTO> utos) {
		String aux;
		try {
			for (int i = 0; i < utos.size(); i++) {
				Configuracion.instancia().leerDoc();
				File f = new File(Configuracion.instancia().getDirUsuarios()
						+ utos.get(i).getNombre());
				Util.borrarDirectorio(f);


			}
			if (utos.size() > 1)
				aux = ResourceBundle.getBundle("internacionalizacion/Etiquetas").getString("etiqueta_exito_eliminar_usuarios");
			else
				aux = ResourceBundle.getBundle("internacionalizacion/Etiquetas").getString("etiqueta_exito_eliminar_usuario");

			Util.popup(1, aux);

		} catch (Exception ex) {
			
			Util.popup(0,ResourceBundle.getBundle("internacionalizacion/Etiquetas").getString("etiqueta_error_eliminar_usuario"));
		}
	}

	public void moverUsuario(String dirOrigen, String dirDestino,
			boolean sobreescribir) {
		try {
			File diSource = new File(dirOrigen);
			File diDestination = new File(dirDestino);
			Util.copyFiles(diSource, diDestination, sobreescribir);
		} catch (Exception e) {
			Util.popup(0, ResourceBundle.getBundle("internacionalizacion/Etiquetas").getString("etiqueta_error_standard"));
		}
	}

	public void cambiarDatosUsuario(UsuarioTO uto) {

		try {
			DocumentBuilderFactory factory = DocumentBuilderFactory
					.newInstance();
			Document doc = null;

			try {
				DocumentBuilder builder = factory.newDocumentBuilder();
				doc = builder.newDocument();

			} catch (Exception spe) {

			}

			// Add the root element

			Element root = doc.createElement("Usuario");
			doc.appendChild(root);
			Util.addTextElement(doc, root, "Nombre", uto.getNombre());
			Util.addTextElement(doc, root, "Imagen", uto.getImagen());
			Util.addTextElement(doc, root, "Barrido", uto.getBarrido());
			Util.addTextElement(doc, root, "Administrador", uto
					.getAdministrador());
			Util.addTextElement(doc, root, "Clave", uto.getClave());
			Util.addTextElement(doc, root, "TiempoBarrido", uto
					.getTiempoBarrido());
			Util.addTextElement(doc, root, "VelocidadPuntero", uto
					.getVelocidadPuntero());
			Util.addTextElement(doc, root, "VolumenVoz", uto.getVolumenVoz());
			Util.addTextElement(doc, root, "VelocidadVoz", uto
					.getVelocidadVoz());
			Util.addTextElement(doc, root, "NombreVoz", uto.getNombreVoz());
			Util.addTextElement(doc, root, "TecladoPrincipal", uto
					.getTecladoPrincipal());
			Util.addTextElement(doc, root, "Oculto", uto.getOculto());
			

			if (uto.getNombre() != "") {
				Configuracion.instancia().leerDoc();
				File dinfo = new File(Configuracion.instancia().getDirUsuarioActual());
				String userAnterior = dinfo.getName();
				if (!dinfo.getName().equals(uto.getNombre())) {

					Util.copyFiles(dinfo, new File(Configuracion.instancia().getDirUsuarios()
							+ uto.getNombre()), true);
					File finfo = new File(Configuracion.instancia().getDirUsuarios()
							+ uto.getNombre() + "//" + userAnterior + ".xml");
					Util.copyFiles(finfo,
							new File(Configuracion.instancia().getDirUsuarios() + uto.getNombre()
									+ "//" + uto.getNombre() + ".xml"), true);
					finfo.delete();
					File fo = new File(Configuracion.instancia().getDirUsuarios() + uto.getNombre()
							+ "//" + userAnterior + ".jpg");
					if (fo.exists()) {
						Util.copyFiles(fo, new File(Configuracion.instancia().getDirUsuarios()
								+ uto.getNombre() + "//" + uto.getNombre()
								+ ".jpg"), true);
					}
					fo.delete();
					Util.borrarDirectorio(dinfo);

				}
			}

			Util.guardarXML(doc, Configuracion.instancia().getDirUsuarios() + uto.getNombre() + "//" + uto.getNombre() + ".xml");
			Util.popup(1, ResourceBundle.getBundle("internacionalizacion/Etiquetas").getString("etiqueta_exito_modificar_datos_usuario"));


		} catch (Exception ex) {
			Util.popup(0, ResourceBundle.getBundle("internacionalizacion/Etiquetas").getString("etiqueta_error_modificar_datos_usuario"));


		}
	}

	public UsuarioTO buscarUsuario(String nombreUsuario) {
		try {
			UsuarioTO devolver = new UsuarioTO();

			DocumentBuilderFactory factory = DocumentBuilderFactory
					.newInstance();
			Document doc = null;

			try {
				Configuracion.instancia().leerDoc();
				DocumentBuilder builder = factory.newDocumentBuilder();
				doc = builder.parse(Configuracion.instancia().getDirUsuarios() + nombreUsuario
						+ "//" + nombreUsuario + ".xml");

			} catch (Exception spe) {

			}

			Node nodoNombre = doc.getElementsByTagName("Nombre").item(0);
			devolver.setNombre(nodoNombre.getTextContent());

			Node nodoImagen = doc.getElementsByTagName("Imagen").item(0);
			devolver.setImagen(nodoImagen.getTextContent());

			Node nodoBarrido = doc.getElementsByTagName("Barrido").item(0);
			devolver.setBarrido(nodoBarrido.getTextContent());

			Node nodoAdministrador = doc.getElementsByTagName("Administrador")
					.item(0);
			devolver.setAdministrador(nodoAdministrador.getTextContent());

			Node nodoClave = doc.getElementsByTagName("Clave").item(0);
			devolver.setClave(nodoClave.getTextContent());

			Node nodoTiempoBarrido = doc.getElementsByTagName("TiempoBarrido")
					.item(0);
			devolver.setTiempoBarrido(nodoTiempoBarrido.getTextContent());

			Node nodoVelocidadPuntero = doc.getElementsByTagName(
					"VelocidadPuntero").item(0);
			devolver.setVelocidadPuntero(nodoVelocidadPuntero.getTextContent());

			Node nodoVolumenVoz = doc.getElementsByTagName("VolumenVoz")
					.item(0);
			devolver.setVolumenVoz(nodoVolumenVoz.getTextContent());

			Node nodoVelocidadVoz = doc.getElementsByTagName("VelocidadVoz")
					.item(0);
			devolver.setVelocidadVoz(nodoVelocidadVoz.getTextContent());

			Node nodoNombreVoz = doc.getElementsByTagName("NombreVoz").item(0);
			devolver.setNombreVoz(nodoNombreVoz.getTextContent());

			Node nodoTecladoPrincipal = doc.getElementsByTagName(
					"TecladoPrincipal").item(0);
			devolver.setTecladoPrincipal(nodoTecladoPrincipal.getTextContent());

			// Para meterle el nuevo tag al xml usuario
			try {
				Node nodoOculto = doc.getElementsByTagName("Oculto").item(0);
				devolver.setOculto(nodoOculto.getTextContent());
			} catch (Exception e) {
				devolver.setOculto("No");
				Configuracion.instancia().leerDoc();
				Configuracion.instancia().setDirUsuarioActual(Configuracion.instancia().getDirUsuarios() + nombreUsuario
						+ "//");
				cambiarDatosUsuario(devolver);
				Configuracion.instancia().setDirUsuarioActual("");
			}
			return devolver;
		} catch (Exception ex) {
			Util.popup(0, ResourceBundle.getBundle("internacionalizacion/Etiquetas").getString("etiqueta_error_standard_XML"));
			return null;
		}
	}

	public List<String> listarUsuarios() {
		List<String> listaUsuarios = new ArrayList<String>();
		Configuracion.instancia().leerDoc();

		File dinfo = new File(Configuracion.instancia().getDirUsuarios());

		for (File dirInfo : dinfo.listFiles()) {
			if (dirInfo.isDirectory()) {
				listaUsuarios.add(dirInfo.getName());
			}
		}

		return listaUsuarios;
	}

}
